
//模板的形式
#include <iostream>
using namespace std;

template <typename T>
T Add(T m_a, T m_b)
{
    cout << "调用函数模板" << endl;
    return (m_a + m_b);
}

int Add(int m_a, int m_c)
{
    cout << "调用普通函数" << endl;
    return (m_a + m_c);
}
int main()
{
    int a = 23;
    int b = 32;
    char c = 'c';
    cout << Add(a, b);
    //cout << Add(a, c); //报错，自动类型推导模板不会发生类型转换
    //  cout << Add<int>(a, c); //正确，显示类型推导，会发生类型转化
    // cout<<Add(a,c);//普通函数也能发生隐式的类型转换
}

//函数模板和普通函数的调用顺序

//结果是调用普通函数，1-共存时优先调用普通函数



//当主函数改为
int main()
{
    int a = 23;
    int b = 32;
    char c = 'c';
    // cout << Add(a, b);
    cout << Add<>(a, b); //强制调用模板函数
    //cout << Add(a, c); //报错，自动类型推导模板不会发生类型转换
    //  cout << Add<int>(a, c); //正确，显示类型推导，会发生类型转化
    // cout<<Add(a,c);//普通函数也能发生隐式的类型转换
}
// 结果，调用模板函数
//结论：可以使用空模板参数列表强制使用模板函数。

//当主函数改为
int main()
{
    int a = 23;
    int b = 32;
    char c = 'c';

    cout << Add(c, c);
 }
// 结论 调用函数模板。
// 原因  使用函数模板可以产生更好的匹配，不需要发生类型转换。